home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / DSIKDEMO.ZIP / MANUAL.TXT < prev    next >
Text File  |  1994-07-18  |  50KB  |  1,297 lines

  1.  
  2.                   Digital Sound Interface Kit (DSIK)
  3.                           Version 1.01a
  4.  
  5.                        ── User's Manual ──
  6.  
  7.                       (C) 1994  Carlos Hasan
  8.  
  9.  
  10. Contents:
  11.  
  12.         1.      Introduction
  13.         1.1     What's in this Manual?
  14.         1.2     Hardware Requirements
  15.         1.3     Contacting the Author
  16.  
  17.         2.      Tutorial
  18.         2.1     Initializing DSIK
  19.         2.2     Playing Digital Samples
  20.         2.3     Playing a Music Module
  21.         2.4     Playing Sound Effects over Music
  22.  
  23.         3.      Programming Guide
  24.         3.1     Initializing DSIK
  25.         3.2     Openining Voice Channels
  26.         3.3     Mixing Voices
  27.         3.4     Playing Music
  28.         3.4.1   Loading a Module
  29.         3.4.2   Playing the Module
  30.         3.4.3   Stopping the Module
  31.         3.5     Sound Effects
  32.         3.5.1   Channels
  33.         3.5.2   Available Channels
  34.         3.5.3   Playing Sounds
  35.         3.5.4   Altering the Playing Sounds
  36.         3.6     Digital Sound Module Format
  37.         3.6.1   Converting Modules
  38.         3.7     Getting Information from DSIK
  39.         3.8     Interrupts
  40.         3.9     Using Timer Services
  41.  
  42.         4.      Reference Guide
  43.         4.1     Functions
  44.         4.2     Structures
  45.  
  46.  
  47.  
  48. Chapter 1. Introduction
  49. ─────────────────────────────────────────────────────────────────────────────
  50.  
  51.     The Digital Sound Interface Kit (DSIK) is an interface library by which
  52.     you can play digital music and sound effects on PCs, and is currently
  53.     available for Borland C++ and Borland Pascal compilers.
  54.  
  55. 1.1 What's in this Manual?
  56.  
  57.     This manual has three parts: Tutorial, Programming Guide and Reference
  58.     Guide sections. The tutorial section of this manual will show you only
  59.     the most basic functions of DSIK. You should read the Programming Guide
  60.     section to learn more about the DSIK's capabilities. For more detailed
  61.     information about every function, structure and equates defined in DSIK
  62.     you should read the Reference Guide section of this manual.
  63.  
  64. 1.2 Hardware and Software Requirements
  65.  
  66.     In order to work with DSIK you need at least an 386SX and a soundcard.
  67.     The supported soundcards are Sound Blaster, Sound Blaster Pro, Sound
  68.     Blaster 16, Gravis Ultrasound and all cards that are 100% compatible
  69.     with any of the above.
  70.     The DSIK library was compiled with Borland C++ version 3.1, but all the
  71.     C source code is included so you can recompile it for older versions of
  72.     Borland C++ compiler (or Turbo C++ compiler).
  73.  
  74. 1.3 Contacting the Author
  75.  
  76.     If you encounter problems, find a bug in this package or want to suggest
  77.     something, use the following Internet email addresses:
  78.  
  79.         Carlos Hasan
  80.         chasan@cec.uchile.cl
  81.         cvaldovi@dcc.uchile.cl
  82.  
  83.  
  84. Chapter 2. Tutorial
  85. ─────────────────────────────────────────────────────────────────────────────
  86.  
  87.     This tutorial will show you how to use DSIK in your own applications
  88.     by providing some simple example programs. These example programs
  89.     will be built from scratch and new features will be added step by
  90.     step through the tutorial.
  91.  
  92. 2.1 Initializing DSIK
  93.  
  94.     Before using any of the DSIK's routines it has to be initialized. First
  95.     you need your soundcard hardware parameters. To ease things there is an
  96.     external program called SETUP which will ask to the user the soundcard
  97.     parameters and will save them into your disk. After, you can load these
  98.     hardware parameters from disk in your own programs. When you have all
  99.     the soundcard parameters, call the routine DSMInit to initialize the
  100.     DSIK sound system.
  101.     Now the program would be able to play sounds on different channels,
  102.     and music modules of course.
  103.  
  104.     Here is an example code for initializing DSIK:
  105.  
  106.     #include <stdio.h>
  107.     #include <stdlib.h>
  108.     #include "sound.h"
  109.  
  110.     int main()
  111.     {
  112.       DSMCard Card;
  113.       if (DSMLoadSetup(&Card)) {
  114.         printf("please run SETUP.EXE to configure.\n");
  115.         exit(EXIT_FAILURE);
  116.       }
  117.       if (DSMInit(&Card)) {
  118.         printf("error initializing DSIK.\n");
  119.         exit(EXIT_FAILURE);
  120.       }
  121.       :
  122.       :
  123.       DSMDone();
  124.     }
  125.  
  126.     If everything went alright and DSMInit found the specified soundcard it
  127.     returns zero. After DSMInit has initialized the system, you must call
  128.     the deinit routine DSMDone before exiting your program.
  129.  
  130. 2.2 Playing Digital Samples
  131.  
  132.     DSIK is now initialized and waits for your instructions. But first you
  133.     have to setup the amount of voices you are going to use and the master
  134.     volume level for all those channels:
  135.  
  136.     DSMSetupVoices(4,96);
  137.  
  138.     Now you have four independant channels to play sounds. To play a digital
  139.     sample (or instrument) you have to load the sample from disk, then pass
  140.     it to DSMPlaySample to start playing the sample. DSIK currently supports
  141.     standard RIFF/WAVE digital sample files which can be loaded from disk
  142.     using the routine DSMLoadSample.
  143.  
  144.     #include <stdio.h>
  145.     #include <stdlib.h>
  146.     #include <conio.h>
  147.     #include "sound.h"
  148.  
  149.     int main()
  150.     {
  151.       DSMCard Card;
  152.       DSMInst *Drum;
  153.       if (DSMLoadSetup(&Card) || DSMInit(&Card))
  154.         exit(EXIT_FAILURE);
  155.       DSMSetupVoices(4,96);
  156.       Drum = DSMLoadSample("DRUM.WAV",0L);  /* load sample from disk */
  157.       DSMPlaySample(0,Drum);                /* play at default frequency */
  158.       while (!kbhit()) DSMPoll();           /* wait any key */
  159.       DSMStopSample(0);                     /* stop voice */
  160.       DSMFreeSample(Drum);                  /* free sample from memory */
  161.       DSMDone();
  162.     }
  163.  
  164.     The previous code loads a digital instrument from disk and plays it on
  165.     the first audio channel at the default frequency and volume.
  166.  
  167. 2.3 Playing a Music Module
  168.  
  169.     Module is a music file format first used in the Amiga computer. There are
  170.     many music formats around like: ProTracker, FastTracker, Scream Tracker,
  171.     Composer 669 and MultiTracker file formats. But DSIK only knows the DSM
  172.     module format, so to play MODs, STMs, S3Ms, 669s, and MTMs they need to
  173.     be converted into DSM format using the utility program CONV.EXE included
  174.     in the DSIK package.
  175.  
  176.     Here is an simple example program to play an DSM module:
  177.  
  178.     #include <stdio.h>
  179.     #include <stdlib.h>
  180.     #include <conio.h>
  181.     #include "sound.h"
  182.  
  183.     int main()
  184.     {
  185.       DSMCard Card;
  186.       DSM *Module;
  187.       if (DSMLoadSetup(&Card) || DSMInit(&Card))
  188.         exit(EXIT_FAILURE);
  189.       Module = DSMLoad("EXAMPLE.DSM",0L);
  190.       DSMSetupVoices(Module->Song.NumChannels,Module->Song.MasterVolume);
  191.       DSMPlayMusic(Module);
  192.       while (!kbhit()) DSMPoll();
  193.       DSMStopMusic();
  194.       DSMFree(Module);
  195.       DSMDone();
  196.     }
  197.  
  198.     When running the program it should play the EXAMPLE.DSM module. If there
  199.     are problems, check that the module exists in the current directory.
  200.  
  201. 2.4 Playing Sound Effects over Music
  202.  
  203.     With DSIK it's possible to play sound effects over the music. All you have
  204.     to do is to open more channels than your module needs. The extra channels
  205.     can be used to play sound effects. Remember that DSIK always uses the first
  206.     channels from the beginning to play the music. For example, for an module
  207.     which uses 4 channels, the channels 0, 1, 2 and 3 will be used to play the
  208.     module. You can use all the unused open channels to play sound effects.
  209.  
  210.  
  211. Chapter 3. Programming Guide
  212. ─────────────────────────────────────────────────────────────────────────────
  213.  
  214.     In this section you will learn more about all the DSIK's capabilities.
  215.     It describes not only what DSIK can do, but also how. For more details
  216.     about every function and structures defined in DSIK you should read the
  217.     Reference Guide section of this manual.
  218.  
  219. 3.1 Initializing DSIK
  220.  
  221.     The first thing you should do to initialize DSIK is to get the soundcard
  222.     hardware parameters (I/O port, IRQ line, DMA channel, mixing rate). The
  223.     structure DSMCard must be filled with these parameters:
  224.  
  225.     typedef struct {
  226.         byte    CardID;             /* Sound card ID */
  227.         word    IOAddr;             /* Port address  */
  228.         byte    IRQNum;             /* IRQ line      */
  229.         byte    DRQNum;             /* DMA channel   */
  230.         word    MixRate;            /* Mixing rate   */
  231.     } DSMCard;
  232.  
  233.     The identification number ID is unique for each card. Here is a list of
  234.     the identification numbers for the currently supported soundcards:
  235.  
  236.     #define ID_NONE     0           /* No soundcard       */
  237.     #define ID_SB       1           /* Sound Blaster      */
  238.     #define ID_SB201    2           /* Sound Blaster 2.01 */
  239.     #define ID_SBPRO    3           /* Sound Blaster Pro  */
  240.     #define ID_SB16     4           /* Sound Blaster 16   */
  241.     #define ID_GUS      5           /* Gravis Ultrasound  */
  242.  
  243.     There are parameters which are unused for some soundcards (for example,
  244.     the GUS soundcard does not requires the mixing rate). Also, the virtual
  245.     soundcard ID_NONE is useful for users without any sound device, because
  246.     your program can use all the DSIK functions without problems, but no
  247.     sound will be heard though.
  248.  
  249.     When the DSMCard structure is filled, call DSMInit with it and check the
  250.     returned value. If the value is zero, then everything went alright and
  251.     DSIK is initialized. Otherwite an error occured.
  252.  
  253.     After initializing DSIK you should make sure that DSMDone is called upon
  254.     exit. The easiest way to do it is to call the routine atexit with the
  255.     address of the DSMDone routine.
  256.  
  257. 3.2 Opening Voice Channels
  258.  
  259.     Now DSIK is initialized, but you can't play any sound with it yet. First
  260.     you will have to call DSMSetupVoices to specify the amount of channel
  261.     voices your program needs and the global master volume level:
  262.  
  263.     DSMSetupVoices(8,96);
  264.  
  265.     The above code will open 8 channel voices and sets the master volume
  266.     level to 96, which is a pretty nice value for that amount of open
  267.     channels. Actually, the master volume parameter is only used in the
  268.     Sound Blaster cards and has no effect in the GUS soundcard.
  269.  
  270. 3.3 Mixing Voices
  271.  
  272.     When everything is initialized it's time to start playing some sounds.
  273.     Before any sound can be heard it has to be loaded from disk. Because
  274.     DSIK supports many more channels than your soundcard supports (except
  275.     for the GUS), DSIK has to combine many channels into a single channel.
  276.     This process is called digital mixing.
  277.  
  278.     DSIK lets you do the mixing whenever you want to do it. It does not
  279.     force you to use the timer interrupt, all that DSIK requires is to call
  280.     the function DSMPoll frequently. Actually this is not required if you are
  281.     using the GUS soundcard which uses his own interrupt service to poll the
  282.     sound system.
  283.  
  284.     To play music and sound effects in background, you only need to call
  285.     DSMPoll regularly. About 50 or 70 times per second should be enough
  286.     in most cases. For higher mixing rates you need to call this routine
  287.     more times than for lower mixing rates.
  288.  
  289.     If you want a timer interrupt to handle all the mixing, you can easily
  290.     hook the DSMPoll into a timer interrupt service:
  291.  
  292.     #include <stdio.h>
  293.     #include <stdlib.h>
  294.     #include "sound.h"
  295.     #include "ts.h"
  296.  
  297.     int main()
  298.     {
  299.       DSMCard Card;
  300.       Module *Module;
  301.       if (DSMLoadSetup(&Card) || DSMInit(&Card))
  302.         exit(EXIT_FAILURE);
  303.       TSInit();
  304.       TSSetRate(70);
  305.       TSSetRoutine(DSMPoll);
  306.       :
  307.       :
  308.       TSDone();
  309.       TSRestoreTime();
  310.       DSMDone();
  311.     }
  312.  
  313.     The previous code will use the timer interrupt to call DSMPoll 70 times
  314.     per second. Notice that the BIOS clock will be updated while using the
  315.     timer services. Anyway, you may call TSRestoreTime() to update the clock
  316.     and date (this routine uses the CMOS real time clock to update the
  317.     software BIOS clock and date).
  318.  
  319.     Here is a short summary of how to initialize DSIK:
  320.  
  321.     - Load the soundcard parameters into the DSMCard structure.
  322.     - Call DSMInit to initialize (be sure to call DSMDone before
  323.       exiting your program).
  324.     - Select the maximum number amount of simultaneos channels
  325.       and the master volume level with DSMSetupVoices.
  326.  
  327. 3.4 Playing Music
  328.  
  329.     After DSIK has been setup to play sounds, you are allowed to play music
  330.     modules. As DSIK uses his own music module format, it's necessary to use
  331.     the utility CONV.EXE to convert standard MODs, STMs, 669s, S3Ms and MTMs
  332.     to the DSM file format.
  333.  
  334. 3.4.1 Loading a Module
  335.  
  336.     Before any music can be played it has to be loaded from the disk into
  337.     system memory (and soundcard memory for the GUS driver). The module
  338.     loader is called as follows:
  339.  
  340.     Module = DSMLoad(FileName,FileOffset);
  341.  
  342.     The FileName is the full path name to the module and FileOffset is where
  343.     the module starts itself in the file (its useful if you have packed all
  344.     your module files into a huge resource file).
  345.     The loader returns a pointer to a DSM structure. If something went wrong,
  346.     NULL is returned and the global variable DSMStatus is set to one of the
  347.     following values to indicate the error occurred:
  348.  
  349.     #define ERR_OK      0           /* no error */
  350.     #define ERR_NORAM   1           /* not enough system memory */
  351.     #define ERR_NODRAM  2           /* not enough soundcard memory */
  352.     #define ERR_NOFILE  3           /* module/sample file not found */
  353.     #define ERR_FORMAT  4           /* invalid file format */
  354.     #define ERR_ACCESS  5           /* file corrupted */
  355.  
  356.     The DSM structure contains all the information about the module, so it
  357.     is totally possible to load multiple modules into memory.
  358.  
  359. 3.4.2 Playing the Module
  360.  
  361.     When the module has been loaded into memory it can be played with a
  362.     single function call:
  363.  
  364.     DSMPlayMusic(Module);
  365.  
  366.     The parameter is a pointer to a variable of type DSM. IF you have set up
  367.     DSIK correctly and mixing routines are called frequently, you should hear
  368.     the music playing in background. If you don't hear any music and no error
  369.     was detected, then something went wrong during initialization (probably
  370.     the soundcard hardware parameters are wrong).
  371.  
  372. 3.4.3 Stopping the Module
  373.  
  374.     If you want to stop the module which is currently being played, call the
  375.     routine DSMStopMusic. The module is always played with looping, which
  376.     means that it will never end until DSMStopMusic is called.
  377.  
  378. 3.5 Sound effects
  379.  
  380.     Playing modules in the background is a thing that can be achieved with
  381.     DSIK, but also you can play sound effects simultaneous with music.
  382.  
  383. 3.5.1 Channels
  384.  
  385.     First you need to know the amount of channels that your program will
  386.     need to play the music and sound effects. For example, if you are going
  387.     to play a 4 channels module and also you want stereo sound effects, you
  388.     need to open 6 channels (four for music and two for the sound effect
  389.     channels). To open the desired amount of channels you does:
  390.  
  391.     DSMSetupVoices(NumChannels,MasterVolume);
  392.  
  393.     The first parameter is the number of channels you want, and the second
  394.     parameter is the master volume level. DSIK currently supports up to 16
  395.     different channels, and they are zero based. That means that the first
  396.     voice channel number is 0, the second is 1, and so on.
  397.  
  398.     DSMSetupVoices can be called multiple times. However, it can't be called
  399.     while music or sound effects are being played. So be sure to stop all
  400.     the channels before changing the amount of channels.
  401.  
  402.     If you try to call DSMSetupVoices while the system is playing music or
  403.     sound effects, you will hear a small crack and the channel frequencies
  404.     will be wrong for a while if you are using the GUS soundcard.
  405.  
  406. 3.5.2 Available Channels
  407.  
  408.     You have opened six channels and DSIK is playing a four channel module,
  409.     so the channels four and five are available for your own sound effects.
  410.     DSIK always uses the first channels starting from zero, so you can be
  411.     sure that playing a sample on channel four or five will not interfere
  412.     with the music.
  413.  
  414. 3.5.3 Playing Sounds
  415.  
  416.     When you want to play a sample, you must load it from disk. The function
  417.     DSMLoadSample loads standard RIFF/WAVE files from disk. If you want to
  418.     write your own sample loader for a different sample file format, do the
  419.     following basic steps:
  420.  
  421.     - Allocate memory for the sample
  422.     - Load the sample into memory
  423.     - Create a DSMInst structure for it
  424.     - Upload the sample to the soundcard memory and release it from
  425.       system memory, if the current soundcard has on board memory.
  426.  
  427.     To learn more about how to load samples into memory, look at the DSIK
  428.     loading routine sources included in the package.
  429.  
  430.     The DSMInst structure contains all the information about a sample
  431.     instrument. Here is the definition of this structure:
  432.  
  433.     typedef struct {
  434.         char    FileName[13];
  435.         word    Flags;
  436.         byte    Volume;
  437.         dword   Length;
  438.         dword   LoopStart;
  439.         dword   LoopEnd;
  440.         void    far *Address;
  441.         word    MidCRate;
  442.         word    Period;
  443.         char    SampleName[28];
  444.     } DSMInst;
  445.  
  446.     After the sample has been loaded in memory, you can play it calling
  447.     the DSMPlaySample function:
  448.  
  449.     DSMPlaySample(Voice,Sample);
  450.  
  451.     where Voice is the channel number and Sample is a pointer to a DSMInst
  452.     sample structure. This function will play the sample at the default
  453.     frequency and volume specified in the DSMInst sample structure (fields
  454.     Period and Volume).
  455.  
  456.     DSIK internally uses period values instead of frequencies. The formula
  457.     to translate frequency values to periods is:
  458.  
  459.     Period = 8363*428/Hertz
  460.  
  461.     Also, DSIK uses volume levels from 0 to 64. These parameters come from
  462.     the Amiga computer and the standard MOD ProTracker file format.
  463.  
  464. 3.5.4 Altering the Playing Sounds
  465.  
  466.     Now that the sample is being played, it would be nice to change the
  467.     frequency and the volume of the sample. DSIK has functions to make it
  468.     possible. Changing the period and volume is as simple as calling:
  469.  
  470.     DSMSetPeriod(Voice,Period);
  471.     DSMSetVolume(Voice,Volume);
  472.  
  473.     Also you can change the channel panning (or balance):
  474.  
  475.     DSMSetBalance(Voice,Balance);
  476.  
  477.     where Balance is a number between 0 (left panned) and 128 (right panned),
  478.     also you can use surround effects setting the balance to 228. There some
  479.     useful equates which you can use to set the balance or panning:
  480.  
  481.     #define PAN_LEFT    0x00        /* left panning    */
  482.     #define PAN_RIGHT   0x80        /* right panning   */
  483.     #define PAN_DOLBY   0xA4        /* surround effect */
  484.  
  485.     Notice that this routine will take effect only in stereo cards, also the
  486.     surround effect works only in SB cards currently.
  487.  
  488. 3.6 Digital Sound Module Format (DSM)
  489.  
  490.     DSIK uses his own music module file format. It was designed to cope with
  491.     a variety of different module formats like MOD, STM, 669, S3M, and MTM.
  492.     It would have been very hard to write a system that supports all those
  493.     module formats, so I have made a system that supports just one format,
  494.     but with a utility to convert other module formats into this format
  495.     called Digital Sound Module Format, or DSM for short.
  496.  
  497. 3.6.1 Converting Modules
  498.  
  499.     As DSIK only supports the DSM format, you need to convert MODs, STMs,
  500.     669s, S3Ms and MTMs into DSM before playing. You can do this manually
  501.     using the CONV.EXE utility. Here is the command line syntaxis:
  502.  
  503.     CONV source[.ext] [dest[.dsm]]
  504.  
  505.     For example, CONV FEEDBACK.S3M will create the FEEDBACK.DSM module file,
  506.     which can be played with the DSIK sound system.
  507.  
  508. 3.7 Getting Information from DSIK
  509.  
  510.     DSIK can give you information about what is going on. There is a routine
  511.     called DSMGetMusicInfo which returns a pointer to the following structure
  512.     which hold a lot of useful information:
  513.  
  514.     typedef struct {
  515.         word    ActiveTracks;
  516.         Track   Tracks[MAXTRACKS];
  517.         byte    OrderPosition;
  518.         byte    OrderLength;
  519.         byte    PatternNumber;
  520.         byte    PatternRow;
  521.         byte    BreakFlag;
  522.         byte    Tempo;
  523.         byte    TempoCount;
  524.         byte    BPM;
  525.         word    CardStatus;
  526.         word    PlayStatus;
  527.         dword   SongPtr;
  528.         byte    SyncMark;
  529.     } DSMMusicInfo;
  530.  
  531.     For synchronization with music you can use the SyncMark field. You need
  532.     to place special synchronization marks in your modules. You can use
  533.     Scream Tracker 3.01 command Z to put these marks. The command parameter
  534.     should be a byte value between 0 and 127. When DSIK encounters this
  535.     command, it sets the internal variable SyncMark with the value of the
  536.     command parameter. So the variable SyncMark always have the previous
  537.     synchronization mark value.
  538.  
  539.     With the Tracks array you get everything you need to know about what is
  540.     currently playing. The structure of each Track is defined as:
  541.  
  542.     typedef struct {
  543.         byte    Note;
  544.         byte    Sample;
  545.         byte    Volume;
  546.         word    Effect;
  547.         byte    EQBar;
  548.     } Track;
  549.  
  550.     The first field is the current note playing on the track. The following
  551.     field is the current instrument number. For example, if you need to know
  552.     the name of the current instrument being played in the track, you can use
  553.     the following code:
  554.  
  555.     Name = Module->Inst[TrackPtr->Sample-1]->SampleName;
  556.  
  557.     The Volume field is self explaining, and the Effect field is the current
  558.     standard Protracker command which is being interpreted.
  559.     There are other internal fields defined in the Track structure, but that
  560.     are not actually very useful for the user programs.
  561.  
  562. 3.8 Interrupts
  563.  
  564.     DSIK doesn't require interrupts. Normally you would poll DSIK in an
  565.     interrupt occuring about 50-70 times per second, which will decrease
  566.     the overhead caused by the interrupt service.
  567.  
  568. 3.9 Using Timer Services
  569.  
  570.     The Timer Service (TS) library was designed for easy handling of the
  571.     timer interrupt service. This library was included because DSIK doesn't
  572.     give you any routine to easily play music and sounds in background.
  573.     With this library you can hook your own routines to be called by the
  574.     timer interrupt service at the specified rates. For example, you can
  575.     hook the DSMPoll routine to be called 70 times per second.
  576.  
  577.     When the TS services are installed the previous BIOS service is called
  578.     at 18.2 Hz, so the BIOS clock time and date are updated normally. You
  579.     may call the routine TSRestoreTime before exiting your application to
  580.     update the BIOS clock and date if required.
  581.  
  582.     First, to initialize the TS routines you must call TSInit and be sure
  583.     to call TSDone to deinitialize the routines upon exit. Now you can hook
  584.     your own service routine with TSSetRoutine and change the timer speed:
  585.  
  586.     TSSetRoutine(MyTimer);
  587.     TSSetRate(70);
  588.  
  589.     This code setup TS to call MyTimer 70 times per second. The speed value
  590.     is given in times per seconds (or hertz) and the minimum value is 19 Hz.
  591.     Your timer service routine must preserve all the CPU registers and return
  592.     using a far stack frame (using the RETF opcode).
  593.  
  594.  
  595. Chapter 4. Reference Guide
  596. ─────────────────────────────────────────────────────────────────────────────
  597.  
  598.     This section of the manual will describe the functions, structures and
  599.     equates defined in DSIK. Functions are listed where each entry contains
  600.     a detailed description on that particular function.
  601.  
  602.  
  603. 4.1 Functions
  604.  
  605. DSMInit
  606. ─────────────────────────────────────────────────────────────────────────────
  607. Function:       Initializes the DSIK sound system.
  608.  
  609. Prototype:      int DSMInit(DSMCard *Card)
  610.  
  611. Parameters:     Card    - Soundcard configuration structure.
  612.  
  613. Returns:        On success, returns a zero value.
  614.                 On error, returns a non zero value.
  615.  
  616. Remarks:        This function must be called to initialize the sound
  617.                 system. When initialized you should make sure that the
  618.                 system will be deinitialized calling DSMDone upon exit.
  619.  
  620. See Also:       DSMDone.
  621.  
  622.  
  623. DSMDone
  624. ─────────────────────────────────────────────────────────────────────────────
  625. Function:       Shutdown the DSIK sound system.
  626.  
  627. Prototype:      void DSMDone(void)
  628.  
  629. Parameters:     None.
  630.  
  631. Returns:        None.
  632.  
  633. Remarks:        This function must be called to deinitialize the sound
  634.                 system upon exit. It will close all the audio channels
  635.                 and will close the current soundcard output.
  636.  
  637. See Also:       DSMInit.
  638.  
  639.  
  640. DSMPoll
  641. ─────────────────────────────────────────────────────────────────────────────
  642. Function:       Polls the DSIK sound system.
  643.  
  644. Prototype:      void DSMPoll(void)
  645.  
  646. Parameters:     None.
  647.  
  648. Returns:        None.
  649.  
  650. Remarks:        This function should be called regularly to play music
  651.                 and sound effects in background. About 50-70 times per
  652.                 second is enough in most cases.
  653.                 This routine is NOT reentrant, so if you are calling it
  654.                 in background using the timer services, do not try call
  655.                 it in foreground from your program.
  656.  
  657. See Also:       None.
  658.  
  659.  
  660. DSMSetupVoices
  661. ─────────────────────────────────────────────────────────────────────────────
  662. Function:       Setup the amount of voice channels.
  663.  
  664. Prototype:      void DSMSetupVoices(word MaxVoices, word MastVolume)
  665.  
  666. Parameters:     MaxVoices   - Number of channels to be opened
  667.                 MastVolume  - Master volume level
  668.  
  669. Returns:        None.
  670.  
  671. Remarks:        This function must be called before any sound can be
  672.                 played. You can call this function many times, but only
  673.                 while the voice channels are stopped. Currently DSIK
  674.                 supports upto 16 different channels, and the master
  675.                 volume level goes from 0 to 255. Actually the master
  676.                 volume parameter has effect only in SB soundcards.
  677.                 A recommended value for the master volume is:
  678.                     MastVolume = 384/MaxVoices
  679.                 where MaxVoices is the amount of opened channels.
  680.  
  681. See Also:       DSMInit, DSMStopVoices.
  682.  
  683.  
  684. DSMStopVoices
  685. ─────────────────────────────────────────────────────────────────────────────
  686. Function:       Stops all the voice channels.
  687.  
  688. Prototype:      void DSMStopVoices(void)
  689.  
  690. Parameters:     Note.
  691.  
  692. Returns:        None.
  693.  
  694. Remarks:        This routine will stop all the currently active voice
  695.                 channels. You should call this routine before changing
  696.                 the amount of voices with DSMSetupVoices.
  697.                 However, this routine won't stop playing the current
  698.                 music module, to do that you should call DSMStopMusic.
  699.  
  700. See Also:       DSMSetupVoices, DSMStopMusic.
  701.  
  702.  
  703. DSMTypeOfRAM
  704. ─────────────────────────────────────────────────────────────────────────────
  705. Function:       Returns the type of RAM used by the soundcard driver.
  706.  
  707. Prototype:      int DSMTypeOfRAM(void)
  708.  
  709. Parameters:     Note.
  710.  
  711. Returns:        RAM_NONE    - Driver not initialized
  712.                 RAM_SYSTEM  - Driver uses system memory
  713.                 RAM_CARD    - Driver uses soundcard memory
  714.  
  715. Remarks:        This is an internal routine used to know which kind of
  716.                 memory the soundcard uses. For example, the GUS soundcard
  717.                 uses his own soundcard memory, so the loading routines
  718.                 will upload the sample digital data to the soundcard
  719.                 and then release it from system memory.
  720.  
  721. See Also:       DSMAllocSampleData, DSMFreeSampleData.
  722.  
  723.  
  724. DSMAllocSampleData
  725. ─────────────────────────────────────────────────────────────────────────────
  726. Function:       Allocates and uploads the sample to the soundcard memory.
  727.  
  728. Prototype:      int DSMAllocSampleData(DSMInst *Inst)
  729.  
  730. Parameters:     Inst        - Sample instrument structure
  731.  
  732. Returns:        On success, returns a zero value.
  733.                 On error, returns a non zero value.
  734.  
  735. Remarks:        This is an internal routine used to allocate and upload
  736.                 the digital sample data to the soundcard. This function
  737.                 has no effect for soundcards which are using only system
  738.                 memory to hold digital samples.
  739.  
  740. See Also:       DSMTypeOfRAM, DSMFreeSampleData.
  741.  
  742.  
  743. DSMFreeSampleData
  744. ─────────────────────────────────────────────────────────────────────────────
  745. Function:       Frees the sample from the soundcard memory.
  746.  
  747. Prototype:      void DSMFreeSampleData(DSMInst *Inst)
  748.  
  749. Parameters:     Inst        - Sample instrument structure
  750.  
  751. Returns:        None.
  752.  
  753. Remarks:        This is an internal routine used to free the sample data
  754.                 from the soundcard memory, which was allocated using the
  755.                 DSMAllocSampleData routine.
  756.  
  757. See Also:       DSMTypeOfRAM, DSMAllocSampleData.
  758.  
  759.  
  760. DSMPlaySample
  761. ─────────────────────────────────────────────────────────────────────────────
  762. Function:       Play a sample instrument.
  763.  
  764. Prototype:      void DSMPlaySample(word Voice, DSMInst *Inst)
  765.  
  766. Parameters:     Voice       - Voice channel number
  767.                 Inst        - Sample instrument structure
  768.  
  769. Returns:        None.
  770.  
  771. Remarks:        This routine will play the specified sample into the
  772.                 desired voice channel number at the default frequency
  773.                 and volume, which are included in the sample instrument
  774.                 structure (fields Period and Volume).
  775.  
  776. See Also:       DSMStopSample, DSMSetPeriod, DSMSetVolume, DSMSetBalance,
  777.                 DSMSetSoundVolume, DSMSetupVoices, DSMStopVoices.
  778.  
  779.  
  780. DSMStopSample
  781. ─────────────────────────────────────────────────────────────────────────────
  782. Function:       Stops a sample instrument.
  783.  
  784. Prototype:      void DSMStopSample(word Voice)
  785.  
  786. Parameters:     Voice       - Voice channel number
  787.  
  788. Returns:        None.
  789.  
  790. Remarks:        This routine will stop the sample which is being played
  791.                 at the specified channel number.
  792.  
  793. See Also:       DSMPlaySample, DSMSetPeriod, DSMSetVolume, DSMSetBalance,
  794.                 DSMSetSoundVolume, DSMSetupVoices, DSMStopVoices.
  795.  
  796.  
  797. DSMSetPeriod
  798. ─────────────────────────────────────────────────────────────────────────────
  799. Function:       Changes the channel period value.
  800.  
  801. Prototype:      void DSMSetPeriod(word Voice, word Period)
  802.  
  803. Parameters:     Voice       - Voice channel number
  804.                 Period      - Period value (28-6848)
  805.  
  806. Returns:        None.
  807.  
  808. Remarks:        This routine will change the period of the specified voice
  809.                 channel number. You can translate frequency values in hertz
  810.                 to period values using the following formula:
  811.                     Period = 8363*428/Hertz
  812.  
  813. See Also:       DSMPlaySample, DSMStopSample, DSMSetVolume, DSMSetBalance,
  814.                 DSMSetSoundVolume, DSMSetupVoices, DSMStopVoices.
  815.  
  816.  
  817. DSMSetVolume
  818. ─────────────────────────────────────────────────────────────────────────────
  819. Function:       Changes the channel volume level.
  820.  
  821. Prototype:      void DSMSetVolume(word Voice, word Volume)
  822.  
  823. Parameters:     Voice       - Voice channel number
  824.                 Volume      - Volume level (0-64)
  825.  
  826. Returns:        None.
  827.  
  828. Remarks:        This routine will change the volume of the specified voice
  829.                 channel number. The volume level goes from 0 to 64.
  830.  
  831. See Also:       DSMPlaySample, DSMStopSample, DSMSetPeriod, DSMSetBalance,
  832.                 DSMSetSoundVolume, DSMSetupVoices, DSMStopVoices.
  833.  
  834.  
  835. DSMSetBalance
  836. ─────────────────────────────────────────────────────────────────────────────
  837. Function:       Changes the channel panning position.
  838.  
  839. Prototype:      void DSMSetBalance(word Voice, word Balance)
  840.  
  841. Parameters:     Voice       - Voice channel number
  842.                 Balance     - Vanning position (0-128,228)
  843.  
  844. Returns:        None.
  845.  
  846. Remarks:        This routine will change the panning position of the
  847.                 specified voice channel number. The panning value goes
  848.                 from 0x00 to 0x80 (left to right panning) and 0xA4 for
  849.                 surround effects. Here is a list of defined equates:
  850.  
  851.                 Constant    Value   Meaning
  852.                 ────────────────────────────────────
  853.                 PAN_LEFT    0x00    Left panning
  854.                 PAN_RIGHT   0x80    Right panning
  855.                 PAN_DOLBY   0xA4    Surround effect
  856.  
  857.                 This routine has effect only in stereo soundcards.
  858.  
  859. See Also:       DSMPlaySample, DSMStopSample, DSMSetPeriod, DSMSetVolume,
  860.                 DSMSetSoundVolume, DSMSetupVoices, DSMStopVoices.
  861.  
  862.  
  863. DSMSetMusicVolume
  864. ─────────────────────────────────────────────────────────────────────────────
  865. Function:       Changes the global volume for all the music channels.
  866.  
  867. Prototype:      void DSMSetMusicVolume(word Volume)
  868.  
  869. Parameters:     Volume      - Volume level (0-255)
  870.  
  871. Returns:        None.
  872.  
  873. Remarks:        This routine will change the global music volume for
  874.                 all the music channels. It's very useful to do fades
  875.                 and for games which are playing sounds over music.
  876.                 Notice that this volume level goes from 0 to 255
  877.                 (not from 0 to 64 like for individual channels).
  878.  
  879. See Also:       DSMPlayMusic, DSMSetSoundVolume, DSMSetupVoices.
  880.  
  881.  
  882. DSMSetSoundVolume
  883. ─────────────────────────────────────────────────────────────────────────────
  884. Function:       Changes the global volume for the sound effects channels.
  885.  
  886. Prototype:      void DSMSetSoundVolume(word Volume)
  887.  
  888. Parameters:     Volume      - Volume level (0-255)
  889.  
  890. Returns:        None.
  891.  
  892. Remarks:        This routine will change the global sound effects volume
  893.                 for all the non-music channels. The sound effect channels
  894.                 are those which are not used to play the current music
  895.                 module.
  896.  
  897. See Also:       DSMPlayMusic, DSMSetMusicVolume, DSMSetupVoices.
  898.  
  899.  
  900. DSMPlayMusic
  901. ─────────────────────────────────────────────────────────────────────────────
  902. Function:       Start playing a music module.
  903.  
  904. Prototype:      void DSMPlayMusic(DSM *Module)
  905.  
  906. Parameters:     Module      - Music module address
  907.  
  908. Returns:        None.
  909.  
  910. Remarks:        This routine will start playing the music module. You should
  911.                 be sure to have enough channels opened to play the music, or
  912.                 you won't hear some of the music track channels.
  913.  
  914. See Also:       DSMStopMusic, DSMSetMusicVolume, DSMSetupVoices.
  915.  
  916.  
  917. DSMStopMusic
  918. ─────────────────────────────────────────────────────────────────────────────
  919. Function:       Stops playing the current music module.
  920.  
  921. Prototype:      void DSMStopMusic(void)
  922.  
  923. Parameters:     Note.
  924.  
  925. Returns:        None.
  926.  
  927. Remarks:        This routine will stop playing the current music module.
  928.                 You must call this routine before calling DSMPlayMusic
  929.                 to play another music module.
  930.  
  931. See Also:       DSMPlayMusic, DSMSetMusicVolume, DSMSetupVoices.
  932.  
  933.  
  934. DSMGetMusicStatus
  935. ─────────────────────────────────────────────────────────────────────────────
  936. Function:       Returns the current playing status of the music.
  937.  
  938. Prototype:      int DSMGetMusicStatus(void)
  939.  
  940. Parameters:     Note.
  941.  
  942. Returns:        PS_STOPPED  - No music is being played
  943.                 PS_PLAYING  - Music is being played
  944.  
  945. Remarks:        None.
  946.  
  947. See Also:       DSMPlayMusic, DSMStopMusic.
  948.  
  949.  
  950. DSMGetMusicInfo
  951. ─────────────────────────────────────────────────────────────────────────────
  952. Function:       Returns the music information structure.
  953.  
  954. Prototype:      DSMMusicInfo *DSMGetMusicStatus(void)
  955.  
  956. Parameters:     Note.
  957.  
  958. Returns:        Static music information structure address.
  959.  
  960. Remarks:        This routine is useful to get all the information that
  961.                 you will need to know what is going on (tracks data,
  962.                 current pattern, tempo, speed, etc).
  963.  
  964. See Also:       DSMMusicInfo.
  965.  
  966.  
  967. DSMLoad
  968. ─────────────────────────────────────────────────────────────────────────────
  969. Function:       Loads a DSM music module from disk.
  970.  
  971. Prototype:      DSM *DSMLoad(char *FileName, dword FileOffset)
  972.  
  973. Parameters:     FileName    - Full path filename
  974.                 FileOffset  - Start of the module within the file
  975.  
  976. Returns:        The module address in memory or NULL if an error occurred
  977.                 while loading it from disk.
  978.  
  979. Remarks:        This routine will load an DSM file from disk. You should
  980.                 convert different file formats like MODs, S3Ms, etc. to
  981.                 DSM files using the CONV.EXE utility.
  982.                 If something went wrong while loading the module file, this
  983.                 function returns NULL and the global variable DSMStatus is
  984.                 set to one of the following values:
  985.  
  986.                 Constant    Value   Meaning
  987.                 ────────────────────────────────────────────────
  988.                 ERR_NORAM   1       Not enough system memory
  989.                 ERR_NODRAM  2       Not enough soundcard memory
  990.                 ERR_NOFILE  3       Module file not found
  991.                 ERR_FORMAT  4       Invalid file format
  992.                 ERR_ACCESS  5       File corrupted
  993.  
  994. See Also:       DSMFree.
  995.  
  996.  
  997. DSMFree
  998. ─────────────────────────────────────────────────────────────────────────────
  999. Function:       Frees a music module from memory.
  1000.  
  1001. Prototype:      void DSMFree(DSM *Module)
  1002.  
  1003. Parameters:     Module      - Music module
  1004.  
  1005. Returns:        None.
  1006.  
  1007. Remarks:        This routine will free an DSM module from memory. You
  1008.                 cannot free a module while it's being played.
  1009.  
  1010. See Also:       DSMLoad.
  1011.  
  1012.  
  1013. DSMLoadSample
  1014. ─────────────────────────────────────────────────────────────────────────────
  1015. Function:       Loads a WAVE sample instrument file from disk.
  1016.  
  1017. Prototype:      DSMInst *DSMLoadSample(char *FileName, dword FileOffset)
  1018.  
  1019. Parameters:     FileName    - Full path filename
  1020.                 FileOffset  - Start of the sample within the file
  1021.  
  1022. Returns:        The sample instrument address or NULL if an error occurred
  1023.                 while loading it from disk.
  1024.  
  1025. Remarks:        This routine will loads an standard RIFF/WAVE sample file
  1026.                 from disk. You should convert other sample file formats
  1027.                 like VOC, AU, etc. to WAV using any third-party conversion
  1028.                 utility.
  1029.                 If something went wrong, the function returns NULL and the
  1030.                 global variable DSMStatus is set with the error type.
  1031.  
  1032. See Also:       DSMFreeSample, DSMLoad.
  1033.  
  1034.  
  1035. DSMFreeSample
  1036. ─────────────────────────────────────────────────────────────────────────────
  1037. Function:       Frees a sample instrument file from memory.
  1038.  
  1039. Prototype:      void DSMLoadSample(DSMInst *Inst)
  1040.  
  1041. Parameters:     Inst        - Sample instrument
  1042.  
  1043. Returns:        None.
  1044.  
  1045. Remarks:        This routine will free the sample instrument from memory.
  1046.                 You cannot free it while it's being played.
  1047.  
  1048. See Also:       DSMLoadSample.
  1049.  
  1050.  
  1051. DSMLoadSetup
  1052. ─────────────────────────────────────────────────────────────────────────────
  1053. Function:       Loads the soundcard configuration file from disk.
  1054.  
  1055. Prototype:      int DSMLoadSetup(DSMCard *Card)
  1056.  
  1057. Parameters:     Card        - Soundcard configuration structure
  1058.  
  1059. Returns:        On success, returns a zero value.
  1060.                 On error, returns a non zero value.
  1061.  
  1062. Remarks:        This routine will loads the file called SOUND.CFG with
  1063.                 the soundcard hardware parameters. This file is created
  1064.                 with the external program SETUP.EXE, or calling the
  1065.                 function DSMSaveSetup.
  1066.  
  1067. See Also:       DSMSaveSetup.
  1068.  
  1069.  
  1070. DSMSaveSetup
  1071. ─────────────────────────────────────────────────────────────────────────────
  1072. Function:       Saves the soundcard configuration file to disk.
  1073.  
  1074. Prototype:      int DSMSaveSetup(DSMCard *Card)
  1075.  
  1076. Parameters:     Card        - Soundcard configuration structure
  1077.  
  1078. Returns:        On success, returns a zero value.
  1079.                 On error, returns a non zero value.
  1080.  
  1081. Remarks:        This routine will save the soundcard structure to the
  1082.                 file called SOUND.CFG.
  1083.  
  1084. See Also:       DSMLoadSetup.
  1085.  
  1086.  
  1087. 4.2 Structures
  1088.  
  1089. DSM structure
  1090. ─────────────────────────────────────────────────────────────────────────────
  1091. Declaration:    typedef struct {
  1092.                     DSMSong Song;
  1093.                     DSMInst far *Inst[MAXSAMPLES];
  1094.                     DSMPatt far *Patt[MAXORDERS];
  1095.                 } DSM;
  1096.  
  1097. Function:       DSM is a structure which holds all the information about
  1098.                 the music module loaded in memory. This structure is loaded
  1099.                 from disk by DSMLoad and is used by DSMPlayMusic.
  1100.  
  1101. Fields:         Song        - Main structure which holds the information
  1102.                               about the module music
  1103.                 Inst        - List of sample instruments used by the module
  1104.                 Patt        - List of patterns used by the module
  1105.  
  1106. See Also:       DSMSong, DSMInst, DSMLoad.
  1107.  
  1108.  
  1109. DSMSong structure
  1110. ─────────────────────────────────────────────────────────────────────────────
  1111. Declaration:    typedef struct {
  1112.                     char    SongName[28];
  1113.                     word    Version;
  1114.                     word    Flags;
  1115.                     dword   Pad;
  1116.                     word    NumOrders;
  1117.                     word    NumSamples;
  1118.                     word    NumPatterns;
  1119.                     word    NumChannels;
  1120.                     byte    GlobalVolume;
  1121.                     byte    MasterVolume;
  1122.                     byte    InitTempo;
  1123.                     byte    InitBPM;
  1124.                     byte    ChanMap[MAXTRACKS];
  1125.                     byte    Orders[MAXORDERS];
  1126.                 } DSMSong;
  1127.  
  1128. Function:       This structure holds information about the module like
  1129.                 the amount of samples, patterns, orders, etc. This is
  1130.                 the main body of the music module, which uses the other
  1131.                 resources, like the samples and patterns, to interpret
  1132.                 and playback the music theme.
  1133.  
  1134. Fields:         SongName    - Name of the music module song
  1135.                 Version     - Module file format
  1136.                 Flags       - Module flags
  1137.                 NumOrders   - Length of the order list
  1138.                 NumSamples  - Number of sample instruments
  1139.                 NumPatterns - Number of pattern sheets
  1140.                 GlobVolume  - Global music volume
  1141.                 MastVolume  - Master volume
  1142.                 InitTempo   - Initial tempo value
  1143.                 InitBPM     - Initial BPM value
  1144.                 ChanMap     - Initial track's panning values
  1145.                 Orders      - Order list
  1146.  
  1147. See Also:       DSM, DSMLoad.
  1148.  
  1149.  
  1150. DSMInst structure
  1151. ─────────────────────────────────────────────────────────────────────────────
  1152. Declaration:    typedef struct {
  1153.                     char    FileName[13];
  1154.                     word    Flags;
  1155.                     byte    Volume;
  1156.                     dword   Length;
  1157.                     dword   LoopStart;
  1158.                     dword   LoopEnd;
  1159.                     void    far *Address;
  1160.                     word    MidCRate;
  1161.                     word    Period;
  1162.                     char    SampleName[28];
  1163.                 } DSMInst;
  1164.  
  1165. Function:       DSMInst is a structure which holds all the information
  1166.                 about an sample instrument. You can load individual
  1167.                 samples from disk using DSMLoadSample.
  1168.                 The sample bit flags are defined as follows:
  1169.  
  1170.                 Constant    Value   Meaning
  1171.                 ──────────────────────────────────────
  1172.                 INST_LOOPED 0x01    Looping enabled
  1173.                 INST_SIGNED 0x02    Signed samples
  1174.                 INST_PACKED 0x04    Packed samples
  1175.  
  1176. Fields:         FileName    - File name of the sample instrument
  1177.                 Flags       - Sample bit flags.
  1178.                 Volume      - Default volume
  1179.                 Length      - Length of the sample
  1180.                 LoopStart   - Loop start point
  1181.                 LoopEnd     - Loop end point
  1182.                 Address     - Used internally to hold the address of
  1183.                               the raw sample data in system memory
  1184.                               or soundcard memory.
  1185.                 MidCRate    - Middle-C frequency finetune value
  1186.                 Period      - Default period value
  1187.                 SampleName  - Name of the sample instrument
  1188.  
  1189. See Also:       DSM, DSMLoad, DSMLoadSample, DSMPlaySample.
  1190.  
  1191.  
  1192. DSMCard structure
  1193. ─────────────────────────────────────────────────────────────────────────────
  1194. Declaration:    typedef struct {
  1195.                     byte    CardID;
  1196.                     word    IOAddr;
  1197.                     byte    IRQNum;
  1198.                     byte    DRQNum;
  1199.                     word    MixRate;
  1200.                 } DSMCard;
  1201.  
  1202. Function:       DSMCard holds the soundcard configuration parameters. This
  1203.                 structure is required by DSMInit to initialize the sound
  1204.                 system. Here is the list of supported soundcards:
  1205.  
  1206.                 Constant    Value   Soundcard Device
  1207.                 ────────────────────────────────────────
  1208.                 ID_NONE     0       None
  1209.                 ID_SB       1       Sound Blaster
  1210.                 ID_SB201    2       Sound Blaster 2.01
  1211.                 ID_SBPRO    3       Sound Blaster Pro
  1212.                 ID_SB16     4       Sound Blaster 16
  1213.                 ID_GUS      5       Gravis Ultrasound
  1214.  
  1215. Fields:         CardID      - Soundcard ID number
  1216.                 IOAddr      - I/O port address
  1217.                 IRQNum      - IRQ line
  1218.                 DRQNum      - DMA channel
  1219.                 MixRate     - Mixing rate
  1220.  
  1221. See Also:       DSMInit, DSMLoadSetup, DSMSaveSetup.
  1222.  
  1223.  
  1224. DSMMusicInfo structure
  1225. ─────────────────────────────────────────────────────────────────────────────
  1226. Declaration:    typedef struct {
  1227.                     word    ActiveTracks;
  1228.                     Track   Tracks[MAXTRACKS];
  1229.                     byte    OrderPosition;
  1230.                     byte    OrderLength;
  1231.                     byte    PatternNumber;
  1232.                     byte    PatternRow;
  1233.                     byte    BreakFlag;
  1234.                     byte    Tempo;
  1235.                     byte    TempoCount;
  1236.                     byte    BPM;
  1237.                     word    CardStatus;
  1238.                     word    PlayStatus;
  1239.                     dword   SongPtr;
  1240.                     byte    SyncMark;
  1241.                 } DSMMusicInfo;
  1242.  
  1243. Function:       This structure is used internally by the system to keep
  1244.                 track of everything that is needed to play a music module.
  1245.                 You can access the static instance of this structure used
  1246.                 by the system using the function DSMGetMusicInfo.
  1247.  
  1248. Fields:         ActiveTracks    - Number of active tracks
  1249.                 Tracks          - Tracks data
  1250.                 OrderPosition   - Current playing position
  1251.                 OrderLength     - Length of the order list
  1252.                 PatternNumber   - Current playing pattern
  1253.                 PatternRow      - Current pattern row
  1254.                 BreakFlag       - Flag used to break patterns
  1255.                                   and for jump position commands
  1256.                 Tempo           - Current speed of the music
  1257.                 BPM             - Current BPM of the music
  1258.                 SyncMark        - The last synchronization mark
  1259.                                   encountered in the patterns
  1260.                 SongPtr         - Address of the playing module
  1261.  
  1262. See Also:       DSMGetMusicInfo, Track.
  1263.  
  1264.  
  1265. Track structure
  1266. ─────────────────────────────────────────────────────────────────────────────
  1267. Declaration:    typedef struct {
  1268.                     word    NoteEvent;
  1269.                     byte    VolumeEvent;
  1270.                     byte    Note;
  1271.                     byte    Sample;
  1272.                     byte    Volume;
  1273.                     word    Effect;
  1274.                     word    Period;
  1275.                     byte    EQBar;
  1276.                     byte    Reserved[...];
  1277.                 } Track;
  1278.  
  1279. Function:       Track is a structure which hold all the information of
  1280.                 each music track channel. There is an array of Tracks
  1281.                 in the DSMMusicInfo structure which is used by the
  1282.                 system to interpret the music patterns.
  1283.  
  1284. Fields:         NoteEvent   - Last note and sample readed from the patterns
  1285.                 VolumeEvent - Last volume field readed from the patterns
  1286.                 Note        - Note index number
  1287.                 Sample      - Sample instrument number
  1288.                 Volume      - Volume level
  1289.                 Effect      - Effect command
  1290.                 Period      - Period value
  1291.                 EQBar       - Equalizer level
  1292.  
  1293. See Also:       DSMMusicInfo.
  1294.  
  1295.  
  1296.  
  1297.